分布式单块系统需要面临哪四个问题
分布式单块系统需要面临以下四个问题:
业务复杂度问题:对于大多数系统而言,架构设计是为了满足业务需求的。衡量架构好坏与否的一个重要方面是看其面对复杂业务变更时所应该具有的灵活性,也就是我们通常所说的可扩展性(Extensibility)。可扩展性是指系统在经历不可避免的变更时所具有的灵活性,与针对提供这样的灵活性所要付出的成本进行平衡的能力。所谓可扩展,可扩展的是业务。即当往SystemA中添加新业务NewSubSystem时,如果不需要改变原有的各个子系统而只需把新业务封闭在一个新的子系统中就能完成整体业务的升级,我们就可以认为系统具有较好的可扩展性。显然,单块系统不具备良好的可扩展性,因为对系统业务的任何一处进行修改,都需要重新构建整个系统并进行发布。单块系统内部没有根据业务结构进行合理的业务拆分是导致其可扩展性低下的主要原因。
代码腐化问题:在软件开发过程中,代码腐化在一定程度上是一种不可避免的现象,关键是腐化的时间和程度与整个产品生命周期之间的关联关系。在产品的鼎盛时期,如果出现大量的代码腐化会对产品的发展带来巨大危害。在单块系统中,由于缺乏合理的业务和技术实现边界,随着产品业务功能的增多,当出现缺陷时,有可能引起缺陷的原因组合就会比较多,这会导致分析、定位和修复缺陷的成本相应增高,也就意味着缺陷的平均修复周期可能会花费更长时间,从而影响到产品的正常迭代和演进。同时,随着功能不断叠加,单块系统的代码结构也日益复杂,在开发人员对全局功能缺乏深度理解的情况下,修复一个缺陷的同时还有可能引入其他的缺陷,在很多技术团队并不具备完善的自动化测试机制的客观条件下,很可能导致问题越修越多的不良循环。
团队问题:互联网行业由于产品价值与市场时机密切相关,普遍崇尚快速试错和迭代发布,很多公司或组织会在比较短的时间内扩充产品功能和开发团队,也就意味着对于过程资产建设和人才培养等方面并不会投入太多的成本,这就要求新加入团队的成员能够快速融入团队并进行代码开发和维护。然而,由于在单块系统中所有的业务和代码在很大程度上无序地混合在一起,存在大量错综复杂的业务和代码结构、由于历史原因所造成的迥然不同的开发风格以及看似复杂但已经不被使用的遗留代码,使得新员工了解行业背景、熟悉应用程序业务、配置本地开发环境等看似简单的任务都变得并不简单。
伸缩性问题:前面讲到单块系统的可扩展性很差,实际上它的可伸缩性同样很有问题。所谓可伸缩(Scalability),伸缩的是性能,即当系统性能出现问题时,如果我们只需要简单添加应用服务器等硬件设备就能避免系统出现性能瓶颈,那么该系统无疑具备较高的可伸缩性。通常,我们会考虑采用水平伸缩的方法实现可伸缩性。当考虑水平伸缩时,一般的做法是建立一个集群,通过在集群中不断地添加新节点,然后借助前端的负载均衡器,将用户的请求按照某种算法分配到不同的节点上。但是,由于单块系统的所有程序代码都运行在服务器上的同一个进程中,内存密集型和CPU密集型并存,也就要求所有应用的服务器都必须有足够的内存和强劲的 CPU 来满足需求。这种方法的成本会比较高,而且资源利用率通常都比较低下。